/**
 * @file LoggerManager.h
 * @brief 日志管理器，提供全局日志接口
 * @author Enterprise Logger Team
 * @date 2024
 */

#ifndef LOGGER_LOGGERMANAGER_H
#define LOGGER_LOGGERMANAGER_H

#include "Logger.h"
#include "AsyncLogger.h"
#include <memory>
#include <string>
#include <mutex>

namespace logger
{

    /**
     * @brief 日志配置结构体
     */
    struct LogConfig
    {
        std::string moduleName = "application";                   // 模块名称
        std::string logDirectory = "./logs";                      // 日志目录
        size_t maxFileSize = 1024 * 1024 * 1024;                  // 单个文件最大大小（默认1GB）
        int flushInterval = 3;                                    // 刷新间隔（秒）
        logger::LogLevel minLevel = logger::LogLevel::INFO_LEVEL; // 最小日志级别
        bool asyncMode = true;                                    // 是否异步模式
        bool consoleOutput = true;                                // 是否同时输出到控制台
    };

    /**
     * @brief 日志管理器单例类
     */
    class LoggerManager
    {
    public:
        // 获取单例实例
        static LoggerManager &getInstance()
        {
            static LoggerManager instance;
            return instance;
        }

        // 初始化日志系统
        bool init(const LogConfig &config);

        // 从配置文件初始化
        bool initFromFile(const std::string &configFile);

        // 关闭日志系统
        void shutdown();

        // 设置日志级别
        void setLogLevel(LogLevel level);

        // 获取日志级别
        LogLevel getLogLevel() const;

        // 刷新日志
        void flush();

        // 获取配置
        const LogConfig &getConfig() const { return config_; }

        // 是否已初始化
        bool isInitialized() const { return initialized_; }
        // 解析文件大小字符串，支持KB、MB、GB等单位
        uint64_t parseFileSize(const std::string &sizeStr) const;

    private:
        LoggerManager() = default;
        ~LoggerManager();

        // 禁用拷贝
        LoggerManager(const LoggerManager &) = delete;
        LoggerManager &operator=(const LoggerManager &) = delete;

        // 异步日志输出函数
        static void asyncOutput(const char *msg, int len);

        // 生成基于当前时间的目录名（格式：YYYYMMDD_HHMMSS）
        std::string generateTimestampDirectory() const;

        // 成员变量
        LogConfig config_;
        std::unique_ptr<AsyncLogger> asyncLogger_;
        bool initialized_ = false;
        mutable std::mutex mutex_;

        // 静态成员
        static LoggerManager *instance_;
    };

    // 便捷初始化函数
    inline bool InitLogger(const LogConfig &config = LogConfig())
    {
        return LoggerManager::getInstance().init(config);
    }

    inline bool InitLoggerFromFile(const std::string &configFile)
    {
        return LoggerManager::getInstance().initFromFile(configFile);
    }

    inline void ShutdownLogger()
    {
        LoggerManager::getInstance().shutdown();
    }

    inline void SetLogLevel(LogLevel level)
    {
        LoggerManager::getInstance().setLogLevel(level);
    }

    inline void FlushLogger()
    {
        LoggerManager::getInstance().flush();
    }

} // namespace logger

// 全局宏定义（简化使用）
#ifndef LOG_TRACE
#define LOG_TRACE logger::LOG_TRACE
#endif

#ifndef LOG_DEBUG
#define LOG_DEBUG logger::LOG_DEBUG
#endif

#ifndef LOG_INFO
#define LOG_INFO logger::LOG_INFO
#endif

#ifndef LOG_WARN
#define LOG_WARN logger::LOG_WARN
#endif

#ifndef LOG_ERROR
#define LOG_ERROR logger::LOG_ERROR
#endif

#ifndef LOG_FATAL
#define LOG_FATAL logger::LOG_FATAL
#endif

#endif // LOGGER_LOGGERMANAGER_H
